package com.unism.common.mybatis;

import static org.apache.ibatis.jdbc.SqlBuilder.BEGIN;
import static org.apache.ibatis.jdbc.SqlBuilder.DELETE_FROM;
import static org.apache.ibatis.jdbc.SqlBuilder.FROM;
import static org.apache.ibatis.jdbc.SqlBuilder.INSERT_INTO;
import static org.apache.ibatis.jdbc.SqlBuilder.SELECT;
import static org.apache.ibatis.jdbc.SqlBuilder.SET;
import static org.apache.ibatis.jdbc.SqlBuilder.SQL;
import static org.apache.ibatis.jdbc.SqlBuilder.UPDATE;
import static org.apache.ibatis.jdbc.SqlBuilder.VALUES;
import static org.apache.ibatis.jdbc.SqlBuilder.WHERE;

import java.lang.reflect.Type;
import java.util.List;
import java.util.Map; 
/**
 * 原理：利用官方的sqlBuilder和反射动态生成通用sql模板，利用现有mybatis框架进行解析
 * 相当于在动态生成mapper.xml文件中的sql
 * @author liuc
 * @param <T>
 */
public class UnismProvider <T extends BasePojo> {
    /**
     * 动态插入记录
     * 待优化点：主键暂时不能动态生成
     * @param obj
     * @return
     */
    public String insert(T obj) {  
        BEGIN();  
        INSERT_INTO(obj.tablename());  
        obj.caculationColumnList();  
        VALUES(obj.returnInsertColumnsName(), obj.returnInsertColumnsDefine());  
        String result=SQL();
        return result;
    }  
    /** 
     * 会根据当前实例的主键更新记录
     * 待优化点：根据业务系统有时候需要只更新非null字段
     * @param obj
     * @return
     */
    public String update(T obj) {  
        String idname = obj.idName();  
        BEGIN();  
        UPDATE(obj.tablename());  
        obj.caculationColumnList();  
        SET(obj.returnUpdateSet());  
        WHERE(idname + "=#{" + idname + "}");  
        String result=SQL();
        return result; 
    }  
    /**
     * 会根据当前实例的主键删除记录
     * @param obj
     * @return
     */
    public String delete(T obj) {  
        String idname = obj.idName();  
        BEGIN();  
        DELETE_FROM(obj.tablename());  
        WHERE(idname + "=#{" + idname + "}");  
        String result=SQL();
        return result;
    }
    public String batchDelete(Map<String, Object> params) { 
    	StringBuilder where=new StringBuilder();
    	T obj=(T) params.get("entity");
    	List<Object> ids=(List<Object>) params.get("ids");
        String idname = obj.idName();  
        Type idType=obj.idType();
        BEGIN();  
        DELETE_FROM(obj.tablename());
        if(ids!=null && !ids.isEmpty()){
        	for(int i=0;i<ids.size();i++){
        		if(idType.equals(String.class)){
        			where.append("'");
        			where.append(ids.get(i));
        			where.append("'");
        		}else{
        			where.append(ids.get(i));
        		}
        		if(i!=ids.size()-1){
        			where.append(",");
        		}
        	}
        }
        WHERE(idname + " in ("+where+")");
        String result=SQL();
        return result;
    }
    /**
     * 查询所有记录
     * 待优化：根据传入对象的字段值动态生成检索调整
     * @param obj
     * @return
     */
    public String getAll(T obj) {  
        BEGIN();  
        SELECT(obj.getTableField());
        FROM(obj.tablename());  
        String result=SQL();
        return result; 
    }  
}
